home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / LISTWIND.PAK / LISTWINX.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  10KB  |  403 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1996, 1996 by Borland International, All Rights Reserved
  4. //
  5. // $Revision:   10.9  $
  6. //----------------------------------------------------------------------------
  7. #include <owl/pch.h>
  8. #include <owl/listwind.h>
  9. #include <owl/listbox.h>
  10. #include <owl/imagelst.h>
  11. #include <owl/menu.h>
  12. #include <owl/editsear.rh>
  13. #include <owl/editfile.rh>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <dir.h>
  17. #include "listwind.rh"
  18.  
  19. const int ListWindId = 100;
  20. const int MAX_ITEMS = 20;
  21. const int MAX_CHARS = 25;
  22.  
  23. //----------------------------------------------------------------------------
  24.  
  25. //
  26. // Class TInfoDialog
  27. // ~~~~~ ~~~~~~~~~~~
  28.  
  29. class TInfoDialog : public TDialog {
  30.   public:
  31.     TInfoDialog(TWindow* parent, int resId, int count);
  32.     static char strings[MAX_ITEMS][MAX_CHARS];
  33.   protected:
  34.     void SetupWindow(void);
  35.   private:
  36.     TListBox* ListBox;
  37.     int Count;
  38. };
  39.  
  40. char TInfoDialog::strings[MAX_ITEMS][MAX_CHARS];
  41.  
  42. TInfoDialog::TInfoDialog(TWindow* parent, int resId, int count)
  43. :
  44.   TDialog(parent, resId),
  45.   Count(count)
  46. {
  47.   ListBox = new TListBox(this, IDC_LISTBOX);
  48. }
  49.  
  50. void
  51. TInfoDialog::SetupWindow()
  52. {
  53.   TDialog::SetupWindow();
  54.  
  55.   // Fill the list box with the list of selected indexes
  56.   //
  57.   for (int i = 0; i < Count; i++)
  58.   {
  59.     ListBox->AddString(strings[i]);
  60.   }
  61. }
  62.  
  63. //-----------------------------------------------------------
  64.  
  65. //
  66. // Class TClientWindow
  67. // ~~~~~ ~~~~~~~~~~~~~
  68. class TClientWindow : public TWindow {
  69.   public:
  70.     TClientWindow(TWindow* parent= 0);
  71.    ~TClientWindow();
  72.  
  73.   protected:
  74.     void SetupWindow();
  75.  
  76.     void EvLButtonUp(uint modKeys, TPoint& point);
  77.     void EvMouseMove(uint modKeys, TPoint& point);
  78.     void LvnBeginDrag(TLwNotify& notify);
  79.  
  80.     // Event handlers
  81.     //
  82.     void CeLargeIcon(TCommandEnabler& ce) {
  83.       ce.SetCheck(Type == LargeIcon ? TCommandEnabler::Checked : TCommandEnabler::Unchecked);
  84.     }
  85.     void CmLargeIcon();
  86.  
  87.     void CeSmallIcon(TCommandEnabler& ce) {
  88.       ce.SetCheck(Type == SmallIcon ? TCommandEnabler::Checked : TCommandEnabler::Unchecked);
  89.     }
  90.     void CmSmallIcon();
  91.  
  92.     void CeList(TCommandEnabler& ce) {
  93.       ce.SetCheck(Type == List ? TCommandEnabler::Checked : TCommandEnabler::Unchecked);
  94.     }
  95.     void CmList();
  96.  
  97.     void CeDetail(TCommandEnabler& ce) {
  98.       ce.SetCheck(Type == Detail ? TCommandEnabler::Checked : TCommandEnabler::Unchecked);
  99.     }
  100.     void CmDetail();
  101.  
  102.     void CeAnySelected(TCommandEnabler& ce) {
  103.       ce.Enable(ListWind->GetSelCount() > 0);
  104.     }
  105.  
  106.     void CmShowSelected();
  107.     void CmShowSelectionState();
  108.     void CmShowSelStrings();
  109.     void CmSelectAll();
  110.     void CmUnselect();
  111.  
  112.     // Data members
  113.     //
  114.     TListWindow*  ListWind;
  115.     TImageList*   LgImageList;
  116.     TImageList*   SmImageList;
  117.     TImageList*   DragImage;
  118.     bool          InDrag;
  119.     char          Buffer[256];
  120.     TRect         DragOffset;
  121.  
  122.     enum TListWindowType {
  123.       LargeIcon,
  124.       SmallIcon,
  125.       List,
  126.       Detail
  127.     } Type;
  128.  
  129.  
  130.   DECLARE_RESPONSE_TABLE(TClientWindow);
  131. };
  132.  
  133. DEFINE_RESPONSE_TABLE1(TClientWindow, TWindow)
  134.   EV_WM_MOUSEMOVE,
  135.   EV_WM_LBUTTONUP,
  136.   EV_COMMAND       (CM_VIEWLARGEICON, CmLargeIcon),
  137.   EV_COMMAND_ENABLE(CM_VIEWLARGEICON, CeLargeIcon),
  138.   EV_COMMAND       (CM_VIEWSMALLICON, CmSmallIcon),
  139.   EV_COMMAND_ENABLE(CM_VIEWSMALLICON, CeSmallIcon),
  140.   EV_COMMAND       (CM_VIEWLIST,      CmList),
  141.   EV_COMMAND_ENABLE(CM_VIEWLIST,      CeList),
  142.   EV_COMMAND       (CM_VIEWDETAIL,    CmDetail),
  143.   EV_COMMAND_ENABLE(CM_VIEWDETAIL,    CeDetail),
  144.   EV_LVN_BEGINDRAG (ListWindId, LvnBeginDrag),
  145.   EV_COMMAND       (CM_SHOWSELECTED,  CmShowSelected),
  146.   EV_COMMAND_ENABLE(CM_SHOWSELECTED,  CeAnySelected),
  147.   EV_COMMAND       (CM_SHOWSTATE,     CmShowSelectionState),
  148.   EV_COMMAND_ENABLE(CM_SHOWSTATE,     CeAnySelected),
  149.   EV_COMMAND       (CM_SHOWSTRINGS,   CmShowSelStrings),
  150.   EV_COMMAND_ENABLE(CM_SHOWSTRINGS,   CeAnySelected),
  151.   EV_COMMAND       (CM_SELECTALL,     CmSelectAll),
  152.   EV_COMMAND       (CM_UNSELECT,      CmUnselect),
  153.   EV_COMMAND_ENABLE(CM_UNSELECT,      CeAnySelected),
  154. END_RESPONSE_TABLE;
  155.  
  156. TClientWindow::TClientWindow(TWindow* parent)
  157. :
  158.   TWindow(parent),
  159.   ListWind(0),
  160.   DragImage(0),
  161.   InDrag(false)
  162. {
  163.   TMenu cMenu(*GetApplication(), IDM_VIEW);
  164.   AssignContextMenu(new TPopupMenu(cMenu));
  165.  
  166.   // Initialize ImageLists
  167.   //
  168.   LgImageList = new TImageList(TSize(32, 32), ILC_COLOR4, 15, 5);
  169.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_1));
  170.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_2));
  171.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_3));
  172.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_4));
  173.  
  174.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_5));
  175.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_6));
  176.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_7));
  177.   LgImageList->Add(TIcon(*GetApplication(), (TResId)ICON_8));
  178.  
  179.   SmImageList = new TImageList(TSize(16, 16), ILC_COLOR4, 15, 5);
  180.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_1));
  181.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_2));
  182.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_3));
  183.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_4));
  184.  
  185.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_5));
  186.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_6));
  187.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_7));
  188.   SmImageList->Add(TIcon(*GetApplication(), (TResId)ICON_8));
  189.  
  190.   // Create Listview control
  191.   //
  192.   Type = SmallIcon;
  193.   ListWind = new TListWindow(this, ListWindId, 40, 40, 300, 250);
  194.   ListWind->Attr.Style |= LVS_SHAREIMAGELISTS | LVS_SMALLICON;
  195.   ListWind->SetBkgndColor( TColor::Sys3dFace );
  196.  
  197.   SetBkgndColor( TColor::Sys3dFace );
  198. }
  199.  
  200. TClientWindow::~TClientWindow()
  201. {
  202.   delete LgImageList;
  203.   delete SmImageList;
  204. }
  205.  
  206. void
  207. TClientWindow::SetupWindow()
  208. {
  209.   TWindow::SetupWindow();
  210.  
  211.   ListWind->SetTextBkColor( TColor::Sys3dFace );
  212.  
  213.   ListWind->SetImageList(*LgImageList, TListWindow::Normal);
  214.   ListWind->SetImageList(*SmImageList, TListWindow::Small);
  215.  
  216.   TListWindColumn column("Column", 100);
  217.   ListWind->InsertColumn(0, column);
  218.  
  219.   for (int i = 0; i < SmImageList->GetImageCount(); i++) {
  220.     sprintf(Buffer, "Item %d", i);
  221.     TListWindItem item(Buffer);
  222.     item.SetImageIndex(i);
  223.     ListWind->InsertItem(item);
  224.   }
  225. }
  226.  
  227. void
  228. TClientWindow::EvLButtonUp(uint, TPoint&)
  229. {
  230.   if (InDrag) {
  231.     InDrag = false;
  232.     ReleaseCapture();
  233.     TImageList::DragLeave(*this);
  234.     TImageList::EndDrag();
  235.     delete DragImage;
  236.     DragImage = 0;
  237.     ShowCursor(true);
  238.   }
  239. }
  240.  
  241. void
  242. TClientWindow::EvMouseMove(uint, TPoint& point)
  243. {
  244.   if (InDrag) {
  245.     TImageList::DragMove(point.x + DragOffset.left, point.y + DragOffset.top);
  246.   }
  247. }
  248.  
  249. void
  250. TClientWindow::LvnBeginDrag(TLwNotify& notify)
  251. {
  252.   InDrag = true;
  253.   TPoint point;
  254.   DragImage = new TImageList(ListWind->CreateDragImage(notify.iItem, &point));
  255.  
  256.   ListWind->GetItemRect(notify.iItem, &DragOffset, TListWindow::Bounds);
  257.  
  258.   DragImage->BeginDrag(0, point.x, point.y);
  259.   SetCapture();
  260.   ShowCursor(false);
  261.   TImageList::DragEnter(*this, point.x, point.y);
  262. }
  263.  
  264. void
  265. TClientWindow::CmLargeIcon()
  266. {
  267.   if( Type != LargeIcon )  {
  268.     Type = LargeIcon;
  269.     ListWind->ModifyStyle(LVS_TYPEMASK, LVS_ICON);
  270.  }
  271. }
  272.  
  273. void
  274. TClientWindow::CmSmallIcon()
  275. {
  276.   if( Type != SmallIcon )  {
  277.     Type = SmallIcon;
  278.     ListWind->ModifyStyle( LVS_TYPEMASK, LVS_SMALLICON );
  279.  }
  280. }
  281.  
  282. void
  283. TClientWindow::CmList()
  284. {
  285.   if( Type != List )  {
  286.     Type = List;
  287.     ListWind->ModifyStyle( LVS_TYPEMASK, LVS_LIST );
  288.   }
  289. }
  290.  
  291. void
  292. TClientWindow::CmDetail()
  293. {
  294.   if( Type != Detail )  {
  295.     Type = Detail;
  296.     ListWind->ModifyStyle( LVS_TYPEMASK, LVS_REPORT );
  297.   }
  298. }
  299.  
  300. void
  301. TClientWindow::CmShowSelected()
  302. {
  303.   int indexes[MAX_ITEMS];
  304.   int count = ListWind->GetSelIndexes(indexes, MAX_ITEMS);
  305.  
  306.   // Fill the dialog's string buffer
  307.   //
  308.   for (int i = 0; i < count; i++)
  309.     itoa(indexes[i], TInfoDialog::strings[i], 10);
  310.  
  311.   // Now show the dialog
  312.   //
  313.   TInfoDialog showSel(this, IDD_SHOWSELECT, count);
  314.   showSel.Execute();
  315. }
  316.  
  317. void
  318. TClientWindow::CmShowSelectionState()
  319. {
  320.   // Enumerate all items and fill the dialog's string buffer
  321.   //
  322.   int count = ListWind->GetItemCount();
  323.   for (int i = 0; i < count; i++) {
  324.     wsprintf(TInfoDialog::strings[i],
  325.       "Item %d %s", i, ListWind->IsSelected(i) ? "selected" : "not selected");
  326.   }
  327.  
  328.   // Show the dialog
  329.   //
  330.   TInfoDialog showSel(this, IDD_SHOWSELECT, count);
  331.   showSel.Execute();
  332. }
  333.  
  334. void
  335. TClientWindow::CmShowSelStrings()
  336. {
  337.   // allocate an array of strings to receive data from the list view
  338.   //
  339.   char* bufferArray[MAX_ITEMS];
  340.   for (int i = 0; i < ListWind->GetSelCount(); i++)
  341.     bufferArray[i] = new char[MAX_CHARS];
  342.  
  343.   // fetch the strings from all selected items
  344.   //
  345.   int count = ListWind->GetSelStrings(bufferArray,
  346.                 MAX_ITEMS, MAX_CHARS);
  347.  
  348.   // copy the strings to the dialog's buffer
  349.   //
  350.   for (int i = 0; i < count; i++) {
  351.     lstrcpy(TInfoDialog::strings[i], bufferArray[i]);
  352.     delete [] bufferArray[i];
  353.   }
  354.  
  355.   // show the dialog
  356.   //
  357.   TInfoDialog showSel(this, IDD_SHOWSELECT, count);
  358.   showSel.Execute();
  359. }
  360.  
  361. void
  362. TClientWindow::CmSelectAll()
  363. {
  364.   ListWind->SetSelItemRange(true, 0, ListWind->GetItemCount() - 1);
  365. }
  366.  
  367. void
  368. TClientWindow::CmUnselect()
  369. {
  370.   int indexes[MAX_ITEMS];
  371.   int count = ListWind->GetSelIndexes(indexes, MAX_ITEMS);
  372.   ListWind->SetSelIndexes(indexes, count, false);
  373. }
  374.  
  375. //----------------------------------------------------------------------------
  376.  
  377. //
  378. // Class TSampleApp
  379. // ~~~~~ ~~~~~~~~~~
  380. class TSampleApp : public TApplication {
  381.   public:
  382.     TSampleApp()
  383.     :
  384.       TApplication()
  385.     {
  386.     }
  387.  
  388.     void InitMainWindow();
  389. };
  390.  
  391. void
  392. TSampleApp::InitMainWindow()
  393. {
  394.   SetMainWindow(new TFrameWindow(0, "ListWindow Example", new TClientWindow));
  395.   GetMainWindow()->AssignMenu(IDM_MENU1);
  396. }
  397.  
  398. int
  399. OwlMain(int /*argc*/, char* /*argv*/[])
  400. {
  401.   return TSampleApp().Run();
  402. }
  403.